home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 November / EnigmA AMIGA RUN 02 (1995)(G.R. Edizioni)(IT)[!][issue 1995-11][Skylink CD].iso / earcd / program / misc / fpl-v13.lha / fpl / src / libinit.c < prev    next >
C/C++ Source or Header  |  1994-11-18  |  8KB  |  209 lines

  1. /******************************************************************************
  2.  *                        FREXX PROGRAMMING LANGUAGE                          *
  3.  ******************************************************************************
  4.  
  5.  libinit.c
  6.  
  7.  Library initialization routines
  8.  
  9.  *****************************************************************************/
  10.  
  11. /************************************************************************
  12.  *                                                                      *
  13.  * fpl.library - A shared library interpreting script langauge.         *
  14.  * Copyright (C) 1992-1994 FrexxWare                                    *
  15.  * Author: Daniel Stenberg                                              *
  16.  *                                                                      *
  17.  * This program is free software; you may redistribute for non          *
  18.  * commercial purposes only. Commercial programs must have a written    *
  19.  * permission from the author to use FPL. FPL is *NOT* public domain!   *
  20.  * Any provided source code is only for reference and for assurance     *
  21.  * that users should be able to compile FPL on any operating system     *
  22.  * he/she wants to use it in!                                           *
  23.  *                                                                      *
  24.  * You may not change, resource, patch files or in any way reverse      *
  25.  * engineer anything in the FPL package.                                *
  26.  *                                                                      *
  27.  * This program is distributed in the hope that it will be useful,      *
  28.  * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
  29.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                 *
  30.  *                                                                      *
  31.  * Daniel Stenberg                                                      *
  32.  * Ankdammsgatan 36, 4tr                                                *
  33.  * S-171 43 Solna                                                       *
  34.  * Sweden                                                               *
  35.  *                                                                      *
  36.  * FidoNet 2:201/328    email:dast@sth.frontec.se                       *
  37.  *                                                                      *
  38.  ************************************************************************/
  39.  
  40. #define  _USEOLDEXEC_ 1
  41. #include <exec/types.h>
  42. #include <exec/nodes.h>
  43. #include <exec/memory.h>
  44. #include <exec/resident.h>
  45. #include <exec/libraries.h>
  46. #include <exec/execbase.h>
  47. #include <libraries/dos.h>
  48. #include <proto/exec.h>
  49. #include <proto/dos.h>
  50. #include <string.h>
  51.  
  52. #include "liballoc.h"
  53.  
  54. long _WBenchMsg;
  55.  
  56. /* Prototypes */
  57. ULONG __asm _LibExpunge( register __a6 struct MyLibrary *libbase );
  58. ULONG __asm _LibInit   ( register __a0 APTR seglist,
  59.                          register __d0 struct MyLibrary *libbase );
  60.  
  61. int  __saveds __asm __UserLibInit   (register __a6 struct MyLibrary *libbase);
  62. void __saveds __asm __UserLibCleanup(register __a6 struct MyLibrary *libbase);
  63.  
  64. int  __saveds __asm __UserDevInit   (register __d0 long unit,
  65.                                      register __a0 struct IORequest *ior,
  66.                                      register __a6 struct MyLibrary *libbase);
  67. void __saveds __asm __UserDevCleanup(register __a0 struct IORequest *ior,
  68.                                      register __a6 struct MyLibrary *libbase);
  69.  
  70. int  __saveds __asm __libfpinit     (register __a6 struct MyLibrary *libbase);
  71. void __saveds __asm __libfpterm     (register __a6 struct MyLibrary *libbase);
  72.  
  73. typedef LONG (*myPFL)();   /* pointer to function returning 32-bit int      */
  74.  
  75. /* library initialization table, used for AUTOINIT libraries                */
  76. struct InitTable {
  77.         ULONG        *it_DataSize;       /* library data space size         */
  78.         myPFL        *it_FuncTable;      /* table of entry points           */
  79.         APTR         it_DataInit;        /* table of data initializers      */
  80.         myPFL        it_InitFunc;        /* initialization function to run  */
  81. };
  82.  
  83. /* symbols generated by blink */
  84. extern char __far _LibID[];             /* ID string                        */
  85. extern char __far _LibName[];           /* Name string                      */
  86. extern char __far RESLEN;               /* size of init data                */
  87. extern long __far NEWDATAL;             /* size of global data              */
  88. extern long __far NUMJMPS;              /* number of jmp vectors to copy    */
  89. extern myPFL _LibFuncTab[];             /* my function table                */
  90. extern long __far _LibVersion;          /* Version of library               */
  91. extern long __far _LibRevision;         /* Revision of library              */
  92. #define MYVERSION ((long)&_LibVersion)
  93. #define MYREVISION ((long)&_LibRevision)
  94. #define DATAWORDS ((long)&NEWDATAL)     /* magic to get right tpye of reloc */ 
  95. #define SIZEJMPTAB ((long)libbase->ml_origbase->ml_numjmps)
  96.                                         /* size in bytes of jmp table       */
  97.  
  98. /* From libent.o, needed to determine where data is loaded by loadseg       */
  99. extern long far _Libmergeddata; 
  100.  
  101. #define MYLIBRARYSIZE ((sizeof(struct MyLibrary) +3) & ~3)
  102.  
  103. struct InitTable __far _LibInitTab =  {
  104.         (long *)(&RESLEN+MYLIBRARYSIZE),
  105.         _LibFuncTab,
  106.         NULL,                        /* will initialize my own data */
  107.         _LibInit,
  108. };
  109.  
  110. __asm ULONG _LibInit( register __a0 APTR seglist,
  111.                       register __d0 struct MyLibrary *libbase )
  112. {
  113.     long *reloc;
  114.     long *sdata;
  115.     char *ddata;
  116.     long nrelocs;
  117.  
  118.       
  119.     libbase->ml_SegList = (ULONG) seglist;
  120.  
  121.     /* init. library structure (since I don't do automatic data init.) */
  122.     libbase->ml_Lib.lib_Node.ln_Type = NT_LIBRARY;
  123.     libbase->ml_Lib.lib_Node.ln_Name =  _LibName;
  124.     libbase->ml_Lib.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;
  125.     libbase->ml_Lib.lib_Version = MYVERSION;
  126.     libbase->ml_Lib.lib_Revision = MYREVISION;
  127.     libbase->ml_Lib.lib_IdString = (APTR) _LibID;
  128.  
  129.      /* Start of copy of global data after structure */
  130.     ddata = (char *)libbase + MYLIBRARYSIZE; 
  131.  
  132.     sdata = (long *)&_Libmergeddata; /* where loadseg loaded the data */
  133.     memcpy(ddata, (void *)sdata, DATAWORDS*4);
  134.  
  135.     /* perform relocs if we want one global section for all programs */
  136.     /* that have this lib open. If we want a global section for each */
  137.     /* open, copy the relocs, and do them on each open call.         */
  138.     sdata = sdata + DATAWORDS;
  139.     nrelocs = *sdata;
  140.     sdata++;
  141.     while (nrelocs > 0)
  142.     {
  143.        reloc = (long *)((long)ddata + *sdata++);
  144.        *reloc += (long)ddata;
  145.        nrelocs--;
  146.     }
  147.     
  148.     if (__UserLibInit(libbase) != 0)
  149.        return NULL; /* abort if user init failed */
  150.  
  151.     return ( (ULONG) libbase );
  152. }
  153.  
  154. LONG __asm _LibOpen( register __a6 struct MyLibrary *libbase )
  155. {
  156.  
  157.     libbase->ml_DosBase = OpenLibrary("dos.library", 33); /* require 33 */
  158.     if(! libbase->ml_DosBase )
  159.       return NULL; /* we failed! */
  160.  
  161.     /* mark us as having another customer */
  162.     libbase->ml_Lib.lib_OpenCnt++;
  163.  
  164.     /* clear delayed expunges (standard procedure) */
  165.     libbase->ml_Lib.lib_Flags &= ~LIBF_DELEXP;
  166.  
  167.     return ( (LONG) libbase );
  168. }
  169.  
  170. ULONG __asm _LibClose( register __a6 struct MyLibrary *libbase )
  171. {
  172.     ULONG retval = 0;
  173.     
  174.     if (( --libbase->ml_Lib.lib_OpenCnt == 0 ) &&
  175.                         ( libbase->ml_Lib.lib_Flags & LIBF_DELEXP ))
  176.     {
  177.         /* no more people have me open,
  178.          * and I have a delayed expunge pending
  179.          */
  180.          retval = _LibExpunge( libbase ); /* return segment list        */
  181.     }
  182.  
  183.     CloseLibrary( libbase->ml_DosBase ); /* close dos.library */
  184.  
  185.     return (retval);
  186. }
  187.  
  188. ULONG __asm _LibExpunge( register __a6 struct MyLibrary *libbase )
  189. {
  190.     ULONG seglist = 0;
  191.     LONG  libsize;
  192.  
  193.     libbase->ml_Lib.lib_Flags |= LIBF_DELEXP;
  194.     if ( libbase->ml_Lib.lib_OpenCnt == 0 )
  195.     {
  196.         /* really expunge: remove libbase and freemem        */
  197.         __UserLibCleanup(libbase);
  198.         seglist = libbase->ml_SegList;
  199.  
  200.         Remove( (struct Node *) libbase);
  201.  
  202.         libsize = libbase->ml_Lib.lib_NegSize + libbase->ml_Lib.lib_PosSize;
  203.         FreeMem( (char *) libbase - libbase->ml_Lib.lib_NegSize,(LONG) libsize );
  204.     }
  205.  
  206.     /* return NULL or real seglist                                */
  207.     return ( (ULONG) seglist );
  208. }
  209.